package com.github.common.extend.demo.config.filetask;

import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.function.Supplier;

/**
 * 文件任务
 * @author wangjj7
 * @date 2023/8/1
 * @description
 */
@Data
@Accessors(chain = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
public class FileTask {

    /**
     * 任务id
     */
    String id;

    /**
     * 模块名
     */
    String modelName;

    /**
     * 查询条件 （注意如果想要支持重复任务共享，实现{@link FileTaskQuery}
     * 或重写hashcode()和equals()方法）
     */
    Object queryCondition;

    /**
     * 任务名
     */
    String taskName;

    /**
     * 文件名（带扩展名）
     */
    String fileName;

    /**
     * 进度
     */
    Double rate;

    /**
     * 创建时间
     */
    LocalDateTime gmtCreated;

    /**
     * 任务结束时间
     */
    LocalDateTime endTime;

    /**
     * 任务状态
     *
     * 0:未完成
     * 1:成功
     * 2:失败
     * 3:已过期
     */
    Integer status;

    /**
     * 失败原因
     */
    String failReason;

    /**
     * 过期时间
     */
    LocalDateTime expiredTime;

    /**
     * 文件id
     */
    String fileId;

    /**
     * 文件大小，单位字节
     */
    Integer fileSize;

    /**
     * 共享的任务id
     * @see #getId()
     */
    String shareTaskId;

    /**
     * 创建人
     */
    String createUser;

    /**
     * 最近心跳时间
     * 任务开始后,定期刷新这个值,超过一定时间未刷新则将任务状态置为失败({@link FileTaskStatus#FAIL})
     * 避免系统非正常退出(比如服务宕机)导致任务一直处于未完成状态({@link FileTaskStatus#UNDONE})
     */
    LocalDateTime heartbeatTime;

    /**
     * 文件删除时间
     */
    LocalDateTime fileDeleteTime;

    /**
     * 文件访问url
     */
    String fileUrl;

    /**
     * 获取文件
     */
    Supplier<InputStream> fileSupplier;

}
